import stringWidth from 'string-width';

/**
 * 中文输入处理工具类
 * 处理中文字符宽度计算、Backspace删除等问题
 */
export class ChineseInputHandler {
  /**
   * 计算字符串在终端中的显示宽度
   * 中文字符占2个字符宽度，英文字符占1个字符宽度
   */
  static getDisplayWidth(text: string): number {
    return stringWidth(text);
  }

  /**
   * 安全地删除字符串最后一个字符
   * 正确处理中文字符、emoji等多字节字符
   */
  static deleteLastChar(text: string): string {
    if (text.length === 0) return text;

    // 使用Array.from正确处理Unicode字符
    const chars = Array.from(text);
    return chars.slice(0, -1).join('');
  }

  /**
   * 在指定位置插入字符
   * 考虑Unicode字符的正确位置计算
   */
  static insertAtPosition(text: string, position: number, char: string): string {
    const chars = Array.from(text);
    return chars.slice(0, position).join('') + char + chars.slice(position).join('');
  }

  /**
   * 在指定位置删除字符
   * 正确处理Unicode字符
   */
  static deleteAtPosition(text: string, position: number): string {
    if (position <= 0) return text;
    
    const chars = Array.from(text);
    return chars.slice(0, position - 1).join('') + chars.slice(position).join('');
  }

  /**
   * 计算光标在指定位置时的显示列数
   */
  static getCursorColumn(text: string, position: number): number {
    const chars = Array.from(text);
    const beforeCursor = chars.slice(0, position).join('');
    return this.getDisplayWidth(beforeCursor);
  }

  /**
   * 根据显示列数找到对应的字符位置
   */
  static getPositionFromColumn(text: string, targetColumn: number): number {
    const chars = Array.from(text);
    let currentColumn = 0;
    
    for (let i = 0; i < chars.length; i++) {
      const charWidth = this.getDisplayWidth(chars[i]);
      if (currentColumn + charWidth > targetColumn) {
        return i;
      }
      currentColumn += charWidth;
    }
    
    return chars.length;
  }

  /**
   * 检查字符是否为中文字符
   */
  static isChineseChar(char: string): boolean {
    const code = char.codePointAt(0);
    if (!code) return false;
    
    // 中文字符Unicode范围
    return (
      (code >= 0x4e00 && code <= 0x9fff) ||   // CJK统一汉字
      (code >= 0x3400 && code <= 0x4dbf) ||   // CJK扩展A
      (code >= 0x20000 && code <= 0x2a6df) || // CJK扩展B
      (code >= 0x2a700 && code <= 0x2b73f) || // CJK扩展C
      (code >= 0x2b740 && code <= 0x2b81f) || // CJK扩展D
      (code >= 0x2b820 && code <= 0x2ceaf) || // CJK扩展E
      (code >= 0x2ceb0 && code <= 0x2ebef) || // CJK扩展F
      (code >= 0x3000 && code <= 0x303f) ||   // CJK符号和标点
      (code >= 0xff00 && code <= 0xffef)      // 全角ASCII
    );
  }

  /**
   * 检查字符是否为全角字符
   */
  static isFullWidthChar(char: string): boolean {
    return this.getDisplayWidth(char) === 2;
  }

  /**
   * 将字符串按显示宽度截断
   */
  static truncateByWidth(text: string, maxWidth: number): string {
    const chars = Array.from(text);
    let currentWidth = 0;
    let result = '';
    
    for (const char of chars) {
      const charWidth = this.getDisplayWidth(char);
      if (currentWidth + charWidth > maxWidth) {
        break;
      }
      result += char;
      currentWidth += charWidth;
    }
    
    return result;
  }

  /**
   * 在字符串中间插入换行符，按显示宽度换行
   */
  static wrapText(text: string, maxWidth: number): string[] {
    const lines: string[] = [];
    const chars = Array.from(text);
    let currentLine = '';
    let currentWidth = 0;
    
    for (const char of chars) {
      if (char === '\n') {
        lines.push(currentLine);
        currentLine = '';
        currentWidth = 0;
        continue;
      }
      
      const charWidth = this.getDisplayWidth(char);
      if (currentWidth + charWidth > maxWidth && currentLine.length > 0) {
        lines.push(currentLine);
        currentLine = char;
        currentWidth = charWidth;
      } else {
        currentLine += char;
        currentWidth += charWidth;
      }
    }
    
    if (currentLine.length > 0) {
      lines.push(currentLine);
    }
    
    return lines;
  }
}